

import time
import asyncio

'''

协程： 微线程， 意义在于充分利用cpu， 减少cpu的阻塞时间

协程就是一个函数，只是它满足以下几个特征：

    依赖 I/O 操作（有 I/O 依赖的操作）

    可以在进行 I/O 操作时暂停

    无法直接运行

async/await

event_loop：事件循环，相当于一个无限循环，我们可以把一些函数注册到这个事件循环上，当满足条件发生的时候，就会调用对应的处理方法。
coroutine：中文翻译叫协程，在 Python 中常指代为协程对象类型，我们可以将协程对象注册到事件循环中，它会被事件循环调用。我们可以使用 async 关键字来定义一个方法，这个方法在调用时不会立即被执行，而是返回一个协程对象。
task：任务，它是对协程对象的进一步封装，包含了任务的各个状态。
future：代表将来执行或没有执行的任务的结果，实际上和 task 没有本质区别。

 

'''

start = time.time()
# def dayin():
#     with open('a.txt', 'w') as f:
#         time.sleep(.1)
#         f.write('test')
#     print('hahah')
#
# def main():
#     dayin()
#
# for i in range(100):
#     main()
#     a = 10
#     b = 20
#     c = a * b
#
async def dayin():
    with open('a.txt', 'a') as f:
        asyncio.sleep(.1)
        f.write('test')
    print('hahah')

async def main():
    await dayin()

# async def main():
#     await write()
# asyncio.run(main())

############## 任务 ###############

# async def main():
#     task1 = asyncio.create_task(write('hello'))  # create 时自动调用执行
#     await task1
# asyncio.run(main(), debug=True)

########### Future 对象 ##########

pass

########### 并发运行 #############

# async def main():
#     results = await asyncio.gather(
#         write('hello'),
#         write('dsc'),
#         write('nice to see you again!')
#     )
#     print(results)
# asyncio.run(main())

'''
    asyncio.wait_for()  等待任务完成， 超时抛异常
    asyncio.wait()

'''
########### wait ###########
# async def write(msg):
#     await asyncio.sleep(2)
#     print(msg)
#     return msg
# async def main():
#     task = asyncio.create_task(write('hello'))
#     await asyncio.wait({task}, timeout=1)
# asyncio.run(main())

########### to_thread ########
async def blocking():
    # with open('a.txt', 'r') as f:
    #     f.read()
    import time
    time.sleep(1)

async def main():
    asyncio.gather(
        asyncio.to_thread(blocking), 
        asyncio.sleep(1)
        )
asyncio.run(main())
